const express = require('express')
const app = express()
const session = require('express-session')

/**
 * body-parser是一个HTTP请求体解析中间件，如果请求体为JSON格式，会解析为JSON格式，如果请求体为字符串，会解析为字符串
 * 如果不使用body-parser，req.body为undefined
 */
const bodyParser = require('body-parser')
app.use(bodyParser.json())

app.use(session({
    secret: 'keyboard cat', // 用来对session数据进行加密的字符串.这个属性值为必须指定的属性
    resave: false, // 是否每次请求都重新保存session 会影响session的存储，为false也会影响session的存储，因为每次请求都是一个新的请求
    saveUninitialized: true, // 是否保存未初始化的session
}))

app.use((req,res,next) => {
    /**
     * 携带cookie时的处理 
     * Access-Control-Allow-Credentials: true
     * 此时Access-Control-Allow-Origin不能设置为*，必须设置为具体的域名
     */
    res.setHeader('Access-Control-Allow-Credentials', true)
    res.setHeader('Access-Control-Allow-Origin', 'http://localhost:3000')

    // res.setHeader('Access-Control-Allow-Origin', '*')
    res.setHeader('Access-Control-Allow-Headers', '*')
    res.setHeader('Access-Control-Allow-Methods', '*')
    next()
})

app.post('/login', (req,res) => {
    let { username, password } = req.body
    if (username === 'admin' && password === 'admin') {
        /**
         * session是服务器端的存储，cookie是客户端的存储
         * session是基于cookie实现的,其信息存储在服务器端
         * 当express-session中间件配置成功后，即可通过req.session获取session对象从而实现session的存储
         * 也可以直接从req.session中获取之前存储的session信息
         */
        req.session.user = { username, password }
        req.session.islogin = true
        res.send({ code: 0, message: '登录成功' })
    } else {
        res.send({ code: 1, message: '登录失败' })
    }
})

// 获取用户姓名的接口
app.get('/getUsername', (req,res) => {
    // 此处的req.session.user是一个空对象
    console.log('获取用户名', req.session)
    /**
     * 此处的req.session.user是空的，如果想要获取到用户信息，需要在登录成功后将用户信息存储到session中
     * 上边的登录接口中已经将用户信息存储到session中，但是此处的req.session.user是空的，因为每次请求都是一个新的请求
     * 如果想要获取到用户信息，需要在前端请求接口时携带cookie
     */
    // 判断用户是否登录
    if (!req?.session?.islogin) {
        return res.send({ code: 1, message: '用户未登录' })
    }
    res.send({ code: 0, message: '用户已登录', username: req.session.user.username })
})

// 退出登录
app.post('/logout', (req, res) => {
    // 销毁session
    req.session.destroy()
    res.send({ code: 0, message: '退出登录成功' })
})

app.listen(8080, () => {
    console.log('server is running at http://localhost:8080')
})